In [ ]:
Copied!
!pip install hyperactive
!pip install hyperactive
Sample strategy¶
In [1]:
Copied!
import talib.abstract as ta
from lettrade import DataFeed, Strategy, crossover, crossunder
from lettrade.exchange.backtest import ForexBackTestAccount, let_backtest
class SmaCross(Strategy):
ema1_period = 9
ema2_period = 21
def indicators(self, df: DataFeed):
df["ema1"] = ta.EMA(df, timeperiod=self.ema1_period)
df["ema2"] = ta.EMA(df, timeperiod=self.ema2_period)
df["signal_ema_crossover"] = crossover(df.ema1, df.ema2)
df["signal_ema_crossunder"] = crossunder(df.ema1, df.ema2)
def next(self, df: DataFeed):
if len(self.orders) > 0 or len(self.trades) > 0:
return
if df.signal_ema_crossover[-1]:
price = self.data.close[-1]
self.buy(size=0.1, sl=price - 0.001, tp=price + 0.001)
elif df.signal_ema_crossunder[-1]:
price = self.data.close[-1]
self.sell(size=0.1, sl=price + 0.001, tp=price - 0.001)
lt = let_backtest(
strategy=SmaCross,
datas="example/data/data/EURUSD_5m_0_10000.csv",
account=ForexBackTestAccount,
)
import talib.abstract as ta
from lettrade import DataFeed, Strategy, crossover, crossunder
from lettrade.exchange.backtest import ForexBackTestAccount, let_backtest
class SmaCross(Strategy):
ema1_period = 9
ema2_period = 21
def indicators(self, df: DataFeed):
df["ema1"] = ta.EMA(df, timeperiod=self.ema1_period)
df["ema2"] = ta.EMA(df, timeperiod=self.ema2_period)
df["signal_ema_crossover"] = crossover(df.ema1, df.ema2)
df["signal_ema_crossunder"] = crossunder(df.ema1, df.ema2)
def next(self, df: DataFeed):
if len(self.orders) > 0 or len(self.trades) > 0:
return
if df.signal_ema_crossover[-1]:
price = self.data.close[-1]
self.buy(size=0.1, sl=price - 0.001, tp=price + 0.001)
elif df.signal_ema_crossunder[-1]:
price = self.data.close[-1]
self.sell(size=0.1, sl=price + 0.001, tp=price - 0.001)
lt = let_backtest(
strategy=SmaCross,
datas="example/data/data/EURUSD_5m_0_10000.csv",
account=ForexBackTestAccount,
)
Example¶
In [2]:
Copied!
from hyperactive import Hyperactive
from hyperactive.optimizers import HillClimbingOptimizer
# define the model in a function
def params_parser(args):
params = [
("ema1_period", int(args["ema1_period"])),
("ema2_period", int(args["ema2_period"])),
]
return params
def result_parser(result):
return result["Equity [$]"]
model = lt.optimize_model(
params_parser=params_parser,
result_parser=result_parser,
fork_data=True,
)
# search space determines the ranges of parameters you want the optimizer to search through
search_space = {
"ema1_period": list(range(5, 25, 1)),
"ema2_period": list(range(10, 50)),
}
optimizer = HillClimbingOptimizer(epsilon=0.1, distribution="laplace", n_neighbours=4)
# start the optimization run
hyper = Hyperactive()
hyper.add_search(model, search_space, optimizer=optimizer, n_iter=1000)
hyper.run()
from hyperactive import Hyperactive
from hyperactive.optimizers import HillClimbingOptimizer
# define the model in a function
def params_parser(args):
params = [
("ema1_period", int(args["ema1_period"])),
("ema2_period", int(args["ema2_period"])),
]
return params
def result_parser(result):
return result["Equity [$]"]
model = lt.optimize_model(
params_parser=params_parser,
result_parser=result_parser,
fork_data=True,
)
# search space determines the ranges of parameters you want the optimizer to search through
search_space = {
"ema1_period": list(range(5, 25, 1)),
"ema2_period": list(range(10, 50)),
}
optimizer = HillClimbingOptimizer(epsilon=0.1, distribution="laplace", n_neighbours=4)
# start the optimization run
hyper = Hyperactive()
hyper.add_search(model, search_space, optimizer=optimizer, n_iter=1000)
hyper.run()
[0] _optimize_model (Hill Climbing): 100%|──────────| 1000/1000 [04:26<00:00, 3.75it/s, best_iter=0, best_pos=[18 3], best_score=1169.0]
Results: '_optimize_model'
Best score: 1169.0
Best parameter set:
'ema1_period' : 23.0
'ema2_period' : 13.0
Best iteration: 0
Random seed: 742903516
Evaluation time : 265.45777797698975 sec [99.95 %]
Optimization time : 0.12505793571472168 sec [0.05 %]
Iteration time : 265.58283591270447 sec [3.77 iter/sec]
In [3]:
Copied!
df = hyper.search_data(model)
df
df = hyper.search_data(model)
df
Out[3]:
| ema1_period | ema2_period | score | |
|---|---|---|---|
| 0 | 23 | 45 | 1008.3 |
| 1 | 10 | 20 | 982.3 |
| 2 | 11 | 23 | 851.7 |
| 3 | 11 | 36 | 940.7 |
| 4 | 17 | 23 | 959.7 |
| ... | ... | ... | ... |
| 995 | 24 | 19 | 959.1 |
| 996 | 15 | 39 | 984.3 |
| 997 | 22 | 39 | 921.7 |
| 998 | 17 | 14 | 1056.1 |
| 999 | 23 | 12 | 1158.4 |
1000 rows × 3 columns
Plot¶
In [5]:
Copied!
import plotly.io as pio
pio.renderers.default = "notebook"
import plotly.io as pio
pio.renderers.default = "notebook"
Type 1¶
In [6]:
Copied!
import plotly.express as px
fig = px.density_heatmap(
df,
x="ema1_period",
y="ema2_period",
z="score",
nbinsx=30,
nbinsy=30,
histfunc="max",
color_continuous_scale="Viridis",
)
fig.show()
import plotly.express as px
fig = px.density_heatmap(
df,
x="ema1_period",
y="ema2_period",
z="score",
nbinsx=30,
nbinsy=30,
histfunc="max",
color_continuous_scale="Viridis",
)
fig.show()
Type 2¶
In [7]:
Copied!
import plotly.express as px
fig = px.density_contour(
df,
x="ema1_period",
y="ema2_period",
z="score",
histfunc="max",
)
fig.update_traces(contours_coloring="fill", contours_showlabels=True)
fig.show()
import plotly.express as px
fig = px.density_contour(
df,
x="ema1_period",
y="ema2_period",
z="score",
histfunc="max",
)
fig.update_traces(contours_coloring="fill", contours_showlabels=True)
fig.show()